<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="ZNH4V" id="ZNH4V"><span data-lake-id="ub0522898" id="ub0522898">典型回答</span></h1>
  <p data-lake-id="u2f2fd8e0" id="u2f2fd8e0"><br></p>
  <p data-lake-id="u7bf291c2" id="u7bf291c2"><strong><span data-lake-id="ubeb12cec" id="ubeb12cec">ClassNotFoundException</span></strong><span data-lake-id="u08bfda46" id="u08bfda46">是一个受检异常（checked exception）。他通常在运行时，在类加载阶段尝试加载类的过程中，找不到类的定义时触发。通常是由Class.forName()或类加载器loadClass或者findSystemClass时，在类路径中没有找到指定名称的类时，会抛出该异常。表示所需的类在类路径中不存在。这通常是由于类名拼写错误或缺少依赖导致的。</span></p>
  <p data-lake-id="u3f4fd6e6" id="u3f4fd6e6"><span data-lake-id="uc26e4554" id="uc26e4554">​</span><br></p>
  <p data-lake-id="u151b17a4" id="u151b17a4"><span data-lake-id="uea283dcf" id="uea283dcf">如以下方式加载JDBC驱动：</span></p>
  <p data-lake-id="ubc4cec1a" id="ubc4cec1a"><span data-lake-id="u64b4451e" id="u64b4451e">​</span><br></p>
  <pre lang="java"><code>
public class MainClass
{
    public static void main(String[] args)
    {
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        }catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
    }
}

</code></pre>
  <p data-lake-id="ued2377ff" id="ued2377ff"><span data-lake-id="u2a7bbb89" id="u2a7bbb89">​</span><br></p>
  <p data-lake-id="u48ecb0d0" id="u48ecb0d0"><span data-lake-id="u1d7749ec" id="u1d7749ec">当我们的classpath中没有对应的jar包时，就会抛出这个ClassNotFoundException。</span></p>
  <p data-lake-id="uc70e338a" id="uc70e338a"><span data-lake-id="u3be58656" id="u3be58656">​</span><br></p>
  <p data-lake-id="uaec8df75" id="uaec8df75"><strong><span data-lake-id="uc955a848" id="uc955a848">NoClassDefFoundError</span></strong><span data-lake-id="u5bcc6a25" id="u5bcc6a25">是一个错误（error），它表示运行时尝试加载一个类的定义时，虽然找到了类文件，但在加载、解析或链接类的过程中发生了问题。这通常是由于依赖问题或类定义文件（.class文件）损坏导致的。也就是说这个类在编译时存在，运行时丢失了，就会导致这个异常。</span></p>
  <p data-lake-id="u123f73e8" id="u123f73e8"><span data-lake-id="uf97d512b" id="uf97d512b">​</span><br></p>
  <p data-lake-id="uc83b7e28" id="uc83b7e28"><span data-lake-id="u3e2c4e73" id="u3e2c4e73">如以下情况，我们定义A类和B类，</span></p>
  <pre lang="java"><code>
class A
{
  // some code
}

public class B
{
    public static void main(String[] args)
    {
        A a = new A();
    }
}

</code></pre>
  <p data-lake-id="u4a8c8672" id="u4a8c8672"><span data-lake-id="u965586f4" id="u965586f4">​</span><br></p>
  <p data-lake-id="u88d8f8e7" id="u88d8f8e7"><span data-lake-id="ubff08b8d" id="ubff08b8d">在编译后会生成A.class和B.class，当我们删除A.class之后，单独运行B.class的时候，就会发生NoClassDefFoundError</span></p>
  <p data-lake-id="u1bb3296c" id="u1bb3296c"><span data-lake-id="u8a56bcd0" id="u8a56bcd0">​</span><br></p>
  <h1 data-lake-id="HCS5m" id="HCS5m"><span data-lake-id="u89d88aa1" id="u89d88aa1">扩展知识</span></h1>
  <p data-lake-id="u8fd6f63d" id="u8fd6f63d"><br></p>
  <h2 data-lake-id="Yfx3r" id="Yfx3r"><span data-lake-id="u7c4e02aa" id="u7c4e02aa" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">NoSuchMethodError</span></h2>
  <p data-lake-id="ucdfe1257" id="ucdfe1257"><span data-lake-id="u12ccfe68" id="u12ccfe68" class="lake-fontsize-12" style="color: rgb(52, 53, 65)">NoSuchMethodError表示方法找不到，他和</span><span data-lake-id="udd9bf8f5" id="udd9bf8f5">NoClassDefFoundError类似，都是编译期找得到，运行期找不到了。</span></p>
  <p data-lake-id="uc944f6b6" id="uc944f6b6"><span data-lake-id="ud659d333" id="ud659d333">​</span><br></p>
  <p data-lake-id="u8b1207d5" id="u8b1207d5"><span data-lake-id="u97b55a9a" id="u97b55a9a">这种error发生在生产环境中是，通常来说大概率是发生了jar包冲突。</span></p>
  <p data-lake-id="ub617749d" id="ub617749d"><br></p>
  <p data-lake-id="ue0b54477" id="ue0b54477"><br></p>
 </body>
</html>